package com.shujia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;

public class InsertTask implements Runnable {
    ArrayList<String[]> linesSplit;
    Connection conn;
    int i;

    public InsertTask(ArrayList<String[]> linesSplit, Connection conn, int i) {
        this.linesSplit = linesSplit;
        this.conn = conn;
        this.i = i;
    }

    public void run() {
        System.out.println("第" + i + "个任务正在运行");
        int cnt = 0;
        int BatchSize = 1000;
        try {
            // 创建prepareStatement
            PreparedStatement preSt = conn.prepareStatement("insert into student_large values(?,?,?,?,?)");
            for (String[] splits : linesSplit) {

                int id = Integer.parseInt(splits[0]);
                String name = splits[1];
                int age = Integer.parseInt(splits[2]);
                String gender = splits[3];
                String clazz = splits[4];

                // 设置参数
                preSt.setInt(1, id);
                preSt.setString(2, name);
                preSt.setInt(3, age);
                preSt.setString(4, gender);
                preSt.setString(5, clazz);

                // 执行 插入 相当于执行了 1000次 insert 语句 （逐条插入）
                //            preSt.executeUpdate();
                // 使用批量插入，将每一条数据放入一个Batch
                preSt.addBatch();

                cnt++;
                // 每达到BatchSize大小即触发一次插入
                if (cnt == BatchSize) {
                    preSt.executeBatch();
                    cnt = 0;
                }
            }
            // 执行 批量插入
            preSt.executeBatch();

            System.out.println("第" + i + "个任务已经完成");

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                conn.close(); // 这里并不会真正关闭连接，而是将使用完的连接放回连接池
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


    }


}
